From 7b3cc673acaa7344461ada7c10ce7f0b3a44370b Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Sun, 18 Jun 2006 19:44:13 +0100 Subject: [PATCH] [XEN] Multi-processor guests need to be more conservative when doing batched writable-pagetable work. Signed-off-by: Keir Fraser --- xen/arch/x86/mm.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 31e6a12ff1..7e800c8ea0 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -3565,17 +3565,27 @@ int ptwr_do_page_fault(struct domain *d, unsigned long addr, } /* - * If this is a multi-processor guest then ensure that the page is hooked - * into at most one L2 table, which must be the one running on this VCPU. + * Multi-processor guest? Then ensure that the page table is hooked into + * at most one L2, and also ensure that there is only one mapping of the + * page table itself (or there can be conflicting writable mappings from + * other VCPUs). */ - if ( (d->vcpu[0]->next_in_list != NULL) && - ((page->u.inuse.type_info & PGT_count_mask) != - (!!(page->u.inuse.type_info & PGT_pinned) + - (which == PTWR_PT_ACTIVE))) ) - { - /* Could be conflicting writable mappings from other VCPUs. */ - cleanup_writable_pagetable(d); - goto emulate; + if ( d->vcpu[0]->next_in_list != NULL ) + { + if ( /* Hooked into at most one L2 table (which this VCPU maps)? */ + ((page->u.inuse.type_info & PGT_count_mask) != + (!!(page->u.inuse.type_info & PGT_pinned) + + (which == PTWR_PT_ACTIVE))) || + /* PTEs are mapped read-only in only one place? */ + ((page->count_info & PGC_count_mask) != + (!!(page->count_info & PGC_allocated) + /* alloc count */ + (page->u.inuse.type_info & PGT_count_mask) + /* type count */ + 1)) ) /* map count */ + { + /* Could be conflicting writable mappings from other VCPUs. */ + cleanup_writable_pagetable(d); + goto emulate; + } } /* -- 2.30.2